const { promisify } = require("util");
const { vueGitRepo } = require("../config/repo");
const execCommand = require("../utils/exec-command");
const compileEjs = require("../utils/compile-ejs");
const writeFile = require("../utils/write-file");
const { program } = require("commander");
const download = promisify(require("download-git-repo"));

async function createProjectAction(project) {
    try {
        // 1.从编写的项目模版中 clone 下来项目
        // 模版在仓库存放的位置，本地存放的文件夹名，克隆
        await download(vueGitRepo, project, { clone: true });

        // 2.很多的脚手架，都是在这里给出提示
        // console.log(`cd ${project}`);
        // console.log(`npm install`);
        // console.log(`npm run dev`);

        // 3.帮助执行 npm install
        // windows 电脑上需要用 npm.cmd 执行命令（win32）
        const commandName = process.platform === "win32" ? "npm.cmd" : "npm";
        await execCommand(commandName, ["install"], { cwd: `./${project}` });

        // 4.帮助执行npm run dev
        // 第一个参数是命令、第二个参数是数组（是参数），cwd 是所在的文件夹
        await execCommand(commandName, ["run", "serve"], { cwd: `./${project}` });
    } catch (error) {
        console.log("github 连接失败，请稍后重试");
    }
}

async function addComponentAction(cpnName) {
    // 1.创建一个组件：编写组件的模版 ejs，根据内容给模版中填充数据
    const content = await compileEjs("component.vue.ejs", {
        name: cpnName,
        lowername: cpnName.toLowerCase()
    });

    // 2.将 content 写入到对应的文件夹中，动态添加到对应的文件夹下
    const dest = program.opts().dest || "src/components";
    await writeFile(`${dest}/${cpnName}.vue`, content);
}

module.exports = {
    createProjectAction,
    addComponentAction
};
